const { _decorator, Component} =cc;

const { ccclass, property } = _decorator;
@ccclass("TagFinder")
export default class TagFinder extends Component {
    private static TagMap = new Map<string, Set<cc.Node>>();
    @property
    Tag: string = "";
    onLoad() {
        TagFinder.Add(this.Tag, this.node);
    }
    onDestroy() {
        TagFinder.Remove(this.Tag, this.node);
    }
    private static Add(tag: string, gameNode: cc.Node) {
        let nodeArr = TagFinder.TagMap.get(tag);
        if (!nodeArr) {
            nodeArr = new Set<cc.Node>();
            TagFinder.TagMap.set(tag, nodeArr);
        }
        nodeArr.add(gameNode);
    }
    private static Remove(tag: string, gameNode: cc.Node) {
        let nodeArr = TagFinder.TagMap.get(tag);
        if (!nodeArr) {
            return;
        }
        nodeArr.delete(gameNode);
        if (nodeArr.size <= 0) {
            TagFinder.TagMap.delete(tag);
        }
    }
    public static FindNodeWithTag(tag: string) {
        let nodeArr = TagFinder.TagMap.get(tag);
        if (!nodeArr) {
            nodeArr = new Set<cc.Node>();
            TagFinder.TagMap.set(tag, nodeArr);
        }
        if (nodeArr.size > 0) {
            return Array.from(nodeArr)[0];
        }
        else {
            return null;
        }
    }
    public static FindNodesWithTags(tag: string) {
        let nodeArr = TagFinder.TagMap.get(tag);
        if (!nodeArr) {
            nodeArr = new Set<cc.Node>();
            TagFinder.TagMap.set(tag, nodeArr);
        }
        return Array.from(nodeArr);
    }
}

